//package org.artifact.core.plugin.ioc;
//
//import java.lang.reflect.Field;
//import java.lang.reflect.Modifier;
//import java.util.ArrayList;
//import java.util.List;
//import java.util.Set;
//
//import org.artifact.core.lang.IPlugin;
//
//import cn.hutool.core.lang.Singleton;
//import cn.hutool.core.util.ClassUtil;
//
//public class IocPlugin implements IPlugin {
//
//	@Override
//	public boolean start() {
//		scan();
//		return true;
//	}
//
//	@Override
//	public boolean stop() {
//		// TODO Auto-generated method stub
//		return false;
//	}
//
//	private void scan() {
//		Set<Class<?>> clazzs = ClassUtil.scanPackageByAnnotation("", org.artifact.core.plugin.ioc.Singleton.class);
//		List<Object> objs = new ArrayList<>();
//		for (Class<?> clazz : clazzs) {
//			Object obj;
//			try {
//				obj = clazz.newInstance();
//				objs.add(obj);
//				Singleton.put(obj);
//			} catch (InstantiationException | IllegalAccessException e) {
//				throw new IllegalStateException("实例化錯誤", e);
//			}
//		}
//
//		for (Object obj : objs) {
//			Field[] fields = ClassUtil.getDeclaredFields(obj.getClass());
//			for (Field field : fields) {
//				ioc(obj, field);
//			}
//		}
//	}
//
//	private void ioc(Object obj, Field field) {
//		try {
//			if (field.isAnnotationPresent(Inject.class)) {
//				field.setAccessible(true);
//				Object value = Singleton.get(field.getType());
//				if (Modifier.isStatic(field.getModifiers())) {
//					field.set(null, value);
//				} else {
//					field.set(obj, value);
//				}
//			}
//		} catch (IllegalArgumentException | IllegalAccessException e) {
//			throw new IllegalStateException("注入錯誤", e);
//		}
//	}
//}
